#ifndef __VTOR_LED_H_
#define __VTOR_LED_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "vtor_elec_module_config.h"

#ifdef __VTOR_LED__

/*
操作说明

闪烁灯情况下
周期固定为为3000ms，
arr为亮灭周期，此值越大，双闪（或三闪）的间隔
ccr为在arr周期内亮灭的时间，此值越大，灯亮的时间越长，就是依靠此值区分长短亮
cycleTime为在3000ms内，对led有效控制的时间，单闪与多闪就是依靠这个值

呼吸灯情况下
arr为亮度调节等级，数字越大，亮度等级越多，但更容易产生闪烁现象
                        小            少，但更不容易闪烁
    综合来看，24比较好
ccr为自动变化的亮度，不需要修改，为保证能平稳变化，建议数字使用0

cycleTime为总呼吸时间，会根据此变量计算每级亮度持续时间，
    数字越小，呼吸越快，数字越大，呼吸越缓，依自身情况而定即可


mode	灯			参考模型        arr参数   ccr参数   cycleTime参数
序号	状态		1亮，0灭      单周期时间   亮时间    亮灭总时间

0		常灭		00000 00000		0			0			0
1		常亮		11111 11111		3000		3000			3000
2		3秒亮灭		11111 00000		3000		1500		3000

3		单短慢闪		10000 00000     200         100        200
4		双短慢闪		10100 00000     200         100        400
5		三短慢闪		10101 00000     200         100        600

6		单长慢闪		11000 00000     500         400        500
7		双长慢闪		11011 00000     500         400        1000
8		三长慢闪		11011 01101     500         400        1500

9		短快闪		10101 01010     200         100       3000
10		中快闪		10101 01010     500         200       3000
11		长快闪		11011 01101     1000        900       3000

12		慢呼吸		01234 43210     24			0			3000
13		中呼吸		01234 43210     24			0			1000
14		快呼吸		02420 02420		24			0			300
*/

// 闪烁灯的周期，一般3000ms足矣，
#define VTOR_LED_CONFIG_BLINK_TOTAL_TIME	3000

// 呼吸灯情况下，肉眼对较高亮度变化不明显，所以不达到最大亮度
#define VTOR_LED_CONFIG_BREATH_MAX_BRIGHTNESS_DIFF 5

typedef struct
{
	int16_t arr;
	int16_t cnt;
	int16_t ccr;
	uint8_t lastState;
}VtorPwm;

typedef struct
{
	int16_t cycleCnt;
	int16_t cycleArr; // 整个闪烁周期（一般1000~2000ms）
	
	int16_t pwmCnt;
	int16_t pwmCcr; // 单个周期内亮的时间
	int16_t pwmArr; // 单个周期的时间
	
	int8_t repeatCnt; // 第多少次闪烁
	int8_t repeatCcr; // 闪烁多少次
	
	uint8_t lastState;
}VtorBlink;


typedef struct
{
	// 无操作
	// 呼吸，渐亮，渐灭
	// 单闪，双闪，三闪，
	// 目前只支持呼吸灯
	int8_t mode;

	// arr cnt ccr 共同模拟变化的pwm
	int16_t pwmArr; // 推荐默认值24
	int16_t pwmCnt;
	int16_t pwmCcr;
	int8_t pwmCcrInc; // 推荐默认值1

	// 亮度持续时间 亮度增长步进 亮度等级数量
	// 总共呼吸时间为  (持续时间+1)*40 ms
	int16_t holdCnt;
	// breath时为arr，推荐默认值(300~3000) / 40 - 1;
	// blink时为ccr，推荐100~3000
	int16_t holdCcr; //别名breathArr， 

	int8_t lastState;
	int8_t curState;

}VtorLed;



void VtorPwm_Init(void);
void VtorPwm_WritePin(VtorPwm* pwm, uint8_t pinState);
void VtorPwm_Run(VtorPwm* pwm, int8_t incTick);
void VtorPwm_SetCcr(VtorPwm* pwm, int16_t ccr);

void VtorBlink_Init(void);
void VtorBlink_WritePin(VtorBlink* blink, uint8_t pinState);
void VtorBlink_Run(VtorBlink* blink, int16_t incTick);
void VtorBlink_SetCcr(VtorBlink* blink, int16_t ccr);

void VtorLed_Init(void);
void VtorLed_SetMode(VtorLed* led, int8_t mode);
void VtorLed_SetParams(VtorLed* led, int16_t arr, int16_t ccr, int16_t cycleTime);
void VtorLed_Run(VtorLed* led, int8_t tickInc);
void VtorLed_WritePin(VtorLed* led, uint8_t pinState);

#endif // __VTOR_LED__

#ifdef __cplusplus
}
#endif

#endif
